import 'dart:convert';

///将 JSON 数据转换为对象或对象列表，以及将对象转换为 JSON 字符串。处理网络请求返回的 JSON 数据或本地存储的 JSON 数据。
class EMPJsonUtil {

  ///encodeObj(dynamic value) 方法用于将一个对象转换为 JSON 字符串。
  ///如果输入的对象是 null，则返回 null；否则使用 json.encode(value) 方法将对象转换为 JSON 字符串并返回。
  static String? encodeObj(dynamic value) {
    return value == null ? null : json.encode(value);
  }

  /// getObj<T>(String? source, T f(Map v)) 方法用于将 JSON 字符串转换为对象。
  /// 它接受一个 JSON 字符串 source 和一个转换方法 f，该方法将 Map 类型的数据转换为指定类型的对象 T。
  /// 如果输入的字符串是 null 或者空字符串，则返回 null；否则，将 JSON 字符串解析为 Map，并使用转换方法 f 将其转换为对象 T。
  static T? getObj<T>(String? source, T f(Map v)) {
    if (source == null || source.isEmpty) return null;
    try {
      Map map = json.decode(source);
      return f(map);
    } catch (e) {
      print('JsonUtil convert error, Exception：${e.toString()}');
    }
    return null;
  }

  /// getObject<T>(dynamic source, T f(Map v)) 方法与 getObj<T> 类似，
  /// 但它可以接受 JSON 字符串或 JSON Map 类型的数据，并将其转换为对象 T。
  static T? getObject<T>(dynamic source, T f(Map v)) {
    if (source == null || source.toString().isEmpty) return null;
    try {
      Map map;
      if (source is String) {
        map = json.decode(source);
      } else {
        map = source;
      }
      return f(map);
    } catch (e) {
      print('JsonUtil convert error, Exception：${e.toString()}');
    }
    return null;
  }

  /// getObjList<T>(String? source, T f(Map v)) 和 getObjectList<T>(dynamic source, T f(Map v)) 方法用于将 JSON 字符串或 JSON Map 列表转换为对象列表。
  /// 它们的功能类似于前面的方法，但是输入的数据是列表形式的 JSON 数据，通过循环遍历列表中的每个元素，将其转换为对象列表。
  static List<T>? getObjList<T>(String? source, T f(Map v)) {
    if (source == null || source.isEmpty) return null;
    try {
      List list = json.decode(source);
      return list.map((value) {
        if (value is String) {
          value = json.decode(value);
        }
        return f(value);
      }).toList();
    } catch (e) {
      print('JsonUtil convert error, Exception：${e.toString()}');
    }
    return null;
  }

  /// getList<T>(dynamic source) 方法用于将字符串形式的 JSON 列表或直接的列表数据转换为指定类型的对象列表。
  /// 如果输入的数据是字符串形式的 JSON 列表，则先解析为列表类型，然后将列表中的每个元素转换为指定类型的对象。
  static List<T>? getObjectList<T>(dynamic source, T f(Map v)) {
    if (source == null || source.toString().isEmpty) return null;
    try {
      List list;
      if (source is String) {
        list = json.decode(source);
      } else {
        list = source;
      }
      return list.map((value) {
        if (value is String) {
          value = json.decode(value);
        }
        return f(value);
      }).toList();
    } catch (e) {
      print('JsonUtil convert error, Exception：${e.toString()}');
    }
    return null;
  }

  /// getList<T>(dynamic source) 方法用于将字符串形式的 JSON 列表或直接的列表数据转换为指定类型的对象列表。
  /// 如果输入的数据是字符串形式的 JSON 列表，则先解析为列表类型，然后将列表中的每个元素转换为指定类型的对象。
  /// [1, 2, 3, 4, 5, 6];
  /// "[\"tom\",\"tony\",\"jacky\"]";
  static List<T>? getList<T>(dynamic source) {
    List? list;
    if (source is String) {
      list = json.decode(source);
    } else {
      list = source;
    }
    return list?.map((v) {
      return v as T;
    }).toList();
  }
}

///T 是一个泛型参数